package com.rgc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.rgc.domain.Participante;
import com.rgc.domain.Ranking;
import com.rgc.domain.Usuario;

public class RankingDaoImpl extends JdbcDaoSupport implements RankingDao {



public List<Ranking> getRankingTop10(String modalidad,String id) {
		try{
			
			if(modalidad.equals("1")){
				String sql= " select ROUND(puntaje-((DATEDIFF(now(),a.fecha)*descuento)*puntaje),0) as puntos,a.idusuario,b.username,b.urlimagen "
						  + " from ranking a,usuario b,configuracion x "
						  + " where a.idusuario=b.idusuario and modalidad='"+modalidad+"' and idjuego='"+id+"' and x.estado=1 and a.estado=1 "
						  + " and ROUND(puntaje-((DATEDIFF(now(),a.fecha)*descuento)*puntaje),0)>0 "
						  + " order by puntaje desc limit 0,10 ";
					List<Ranking> ranked =  getJdbcTemplate().query(
					sql, new BeanPropertyRowMapper<Ranking>(Ranking.class));
			
			return ranked;
			}
			if(modalidad.equals("2")){
				String sql= " select ROUND(puntaje-((DATEDIFF(now(),a.fecha)*descuento)*puntaje),0) as puntos,a.idequipo,b.nombre as username,b.urlimagen "
						  + " from ranking a,equipo b,configuracion x "
						  + " where a.idequipo=b.idequipo and modalidad='"+modalidad+"' and idjuego='"+id+"' and x.estado=1 and a.estado=1 "
						  + " and ROUND(puntaje-((DATEDIFF(now(),a.fecha)*descuento)*puntaje),0)>0 "
						  + " order by puntaje desc limit 0,10 ";
					List<Ranking> ranked =  getJdbcTemplate().query(
					sql, new BeanPropertyRowMapper<Ranking>(Ranking.class));

			return ranked;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return new ArrayList<Ranking>();
	}

public List<Ranking> getRankingTop(int modalidad,String id) {
	return getRankingTop(modalidad+"",id);
}
public List<Ranking> getRankingTop(String modalidad,String id) {
	try{
		
		if(modalidad.equals("1")){
			String sql= " select ROUND(puntaje-((DATEDIFF(now(),a.fecha)*descuento)*puntaje),0) as puntos,a.idusuario,b.username,b.urlimagen "
					  + " from ranking a,usuario b,configuracion x "
					  + " where a.idusuario=b.idusuario and modalidad='"+modalidad+"' and idjuego='"+id+"' and x.estado=1 and a.estado=1 "
					  + " and ROUND(puntaje-((DATEDIFF(now(),a.fecha)*descuento)*puntaje),0)>0 "
					  + " order by puntaje desc  ";
				List<Ranking> ranked =  getJdbcTemplate().query(
				sql, new BeanPropertyRowMapper<Ranking>(Ranking.class));
		
		return ranked;
		}
		if(modalidad.equals("2")){
			String sql= " select ROUND(puntaje-((DATEDIFF(now(),a.fecha)*descuento)*puntaje),0) as puntos,a.idequipo,b.nombre as username,b.urlimagen "
					  + " from ranking a,equipo b,configuracion x "
					  + " where a.idequipo=b.idequipo and modalidad='"+modalidad+"' and idjuego='"+id+"' and x.estado=1 and a.estado=1 "
					  + " and ROUND(puntaje-((DATEDIFF(now(),a.fecha)*descuento)*puntaje),0)>0 "
					  + " order by puntaje desc  ";
				List<Ranking> ranked =  getJdbcTemplate().query(
				sql, new BeanPropertyRowMapper<Ranking>(Ranking.class));
				System.out.println("CONSULTA EQUIPO"+sql);
		return ranked;
		}
	}catch(Exception e){
		e.printStackTrace();
	}
	return new ArrayList<Ranking>();
}

	public boolean addRanking(List<Participante> participante,final String modalidad,final String idjuego){
		try{
			for(final Participante p:participante){
				if(modalidad.equals("1")){
					String sql= " select *,ROUND(puntaje-((DATEDIFF(now(),fecha)*0.003)*puntaje),0) as puntos from ranking "
							  + " where modalidad='"+modalidad+"' and idjuego='"+idjuego+"' and idusuario='"+p.getIdusuario()+"' and estado=1 "
							  + " order by puntaje desc";
					
					List<Ranking> ranked =  getJdbcTemplate().query(
							sql, new BeanPropertyRowMapper<Ranking>(Ranking.class));
					int puntaje=0;
					
					if(ranked.size()>0){
						Ranking r=ranked.get(0);	
						sql= "UPDATE ranking set estado=0 where idranking='"+r.getIdranking()+"' ";
						getJdbcTemplate().update(sql);
						if(Integer.parseInt(r.getPuntos())>0)
							puntaje=Integer.parseInt(r.getPuntos());
					}	
					final int puntaje2=puntaje;	
					final String sqlU = "INSERT INTO ranking(puntaje,idequipo,idusuario,modalidad,idjuego) values(?,?,?,?,?)";
					getJdbcTemplate().update(
							new PreparedStatementCreator()
					        {
					            public PreparedStatement createPreparedStatement(Connection conn) throws SQLException
					            {
					                PreparedStatement preparedStatement = conn.prepareStatement(sqlU, Statement.RETURN_GENERATED_KEYS);
					                preparedStatement.setInt(1,p.getPuntaje()+puntaje2);
					                preparedStatement.setString(2,"0");
					                preparedStatement.setString(3,p.getIdusuario());
					                preparedStatement.setString(4,modalidad);
					                preparedStatement.setString(5,idjuego);
					                return preparedStatement;
					            }
					        }	
							);

				}
	
				if(modalidad.equals("2")){
					String sql= " select *,ROUND(puntaje-((DATEDIFF(now(),fecha)*0.003)*puntaje),0) as puntos from ranking "
							  + " where modalidad='"+modalidad+"' and idjuego='"+idjuego+"' and idequipo='"+p.getIdequipo()+"' and estado=1 "
							  + " order by ROUND(puntaje-((DATEDIFF(now(),fecha)*0.003)*puntaje),0) desc";
					List<Ranking> ranked =  getJdbcTemplate().query(
							sql, new BeanPropertyRowMapper<Ranking>(Ranking.class));
					
					int puntaje=0;
					if(ranked.size()>0){
						
						final Ranking r=ranked.get(0);
						
						sql= "UPDATE ranking set estado=0 where idranking='"+r.getIdranking()+"' ";
						getJdbcTemplate().update(sql);
						if(Integer.parseInt(r.getPuntos())>0)
							puntaje=Integer.parseInt(r.getPuntos());
					}
						
					final int puntaje2=puntaje;	
					final String sqlU = "INSERT INTO ranking(puntaje,idequipo,idusuario,modalidad,idjuego) values(?,?,?,?,?)";
					getJdbcTemplate().update(
						new PreparedStatementCreator()
				        {
				            public PreparedStatement createPreparedStatement(Connection conn) throws SQLException
				            {
				                PreparedStatement preparedStatement = conn.prepareStatement(sqlU, Statement.RETURN_GENERATED_KEYS);
				                preparedStatement.setInt(1,p.getPuntaje()+puntaje2);
				                preparedStatement.setString(2,p.getIdequipo());
				                preparedStatement.setString(3,"0");
				                preparedStatement.setString(4,modalidad);
				                preparedStatement.setString(5,idjuego);
				                return preparedStatement;
				            }
				        }	
						);
	
						
	
				}
				
				
							

			}
			return true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}

	public String getMiTop(Usuario usuario) {
		
		String sql=  " select *,ROUND(puntaje-((DATEDIFF(now(),fecha)*0.003)*puntaje),0) as puntos "
					+" from ranking where idusuario='"+usuario.getIdusuario()+"' and estado='1' and ROUND(puntaje-((DATEDIFF(now(),fecha)*0.003)*puntaje),0)>0 "
					+" order by ROUND(puntaje-((DATEDIFF(now(),fecha)*0.003)*puntaje),0) desc ";

		List<Ranking> ranked =  getJdbcTemplate().query(
		sql, new BeanPropertyRowMapper<Ranking>(Ranking.class));
		if(ranked.size()>0)
			return ranked.get(0).getPuntos();
		return "0";
	}

	public String getMisJuegos(Usuario usuario) {
		String sql=  " select *,ROUND(puntaje-((DATEDIFF(now(),fecha)*0.003)*puntaje),0) as puntos "
				+" from ranking where idusuario='"+usuario.getIdusuario()+"' and estado='1' and ROUND(puntaje-((DATEDIFF(now(),fecha)*0.003)*puntaje),0)>0 "
				+" order by ROUND(puntaje-((DATEDIFF(now(),fecha)*0.003)*puntaje),0) desc ";

	List<Ranking> ranked =  getJdbcTemplate().query(
	sql, new BeanPropertyRowMapper<Ranking>(Ranking.class));
	if(ranked.size()>0)
		return ranked.size()+"";
	return "0";
	}

}
